/** @file
  Differentiated System Description Table Fields (DSDT)

  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
  Copyright (c) 2016, Hisilicon Limited. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

Scope(_SB)
{
  Device (MDIO)
  {
    OperationRegion(CLKR, SystemMemory, 0x60000550, 8)
    Field(CLKR, DWordAcc, NoLock, Preserve) {
      CLKE, 1,  // clock enable
      , 31,
      CLKD, 1,  // clode disable
      , 31,
    }
    OperationRegion(RSTR, SystemMemory, 0x60000c40, 8)
    Field(RSTR, DWordAcc, NoLock, Preserve) {
      RSTE, 1,  // reset
      , 31,
      RSTD, 1,  // de-reset
      , 31,
    }

    Name(_HID, "HISI0141")
    Name(_CRS, ResourceTemplate() {
      Memory32Fixed (ReadWrite, 0x603c0000 , 0x10000)
    })

    Method(_RST, 0, Serialized) {
      Store (0x1, RSTE)
      Sleep (10)
      Store (0x1, CLKD)
      Sleep (10)
      Store (0x1, RSTD)
      Sleep (10)
      Store (0x1, CLKE)
      Sleep (10)
    }
  }

  Device (DSF0)
  {
    OperationRegion(H3SR, SystemMemory, 0xC0000184, 4)
    Field(H3SR, DWordAcc, NoLock, Preserve) {
      H3ST, 1,
      , 31,  //RESERVED
    }
    OperationRegion(H4SR, SystemMemory, 0xC0000194, 4)
    Field(H4SR, DWordAcc, NoLock, Preserve) {
      H4ST, 1,
      , 31,  //RESERVED
    }
    // DSAF RESET
    OperationRegion(DRER, SystemMemory, 0xC0000A00, 8)
    Field(DRER, DWordAcc, NoLock, Preserve) {
      DRTE, 1,
      , 31,  //RESERVED
      DRTD, 1,
      , 31,  //RESERVED
    }
    // NT RESET
    OperationRegion(NRER, SystemMemory, 0xC0000A08, 8)
    Field(NRER, DWordAcc, NoLock, Preserve) {
      NRTE, 1,
      , 31,  //RESERVED
      NRTD, 1,
      , 31,  //RESERVED
    }
    // XGE RESET
    OperationRegion(XRER, SystemMemory, 0xC0000A10, 8)
    Field(XRER, DWordAcc, NoLock, Preserve) {
      XRTE, 31,
      , 1,    //RESERVED
      XRTD, 31,
      , 1,    //RESERVED
    }

    // GE RESET
    OperationRegion(GRTR, SystemMemory, 0xC0000A18, 16)
    Field(GRTR, DWordAcc, NoLock, Preserve) {
      GR0E, 30,
      , 2,    //RESERVED
      GR0D, 30,
      , 2,    //RESERVED
      GR1E, 18,
      , 14,  //RESERVED
      GR1D, 18,
      , 14,  //RESERVED
    }
    // PPE RESET
    OperationRegion(PRTR, SystemMemory, 0xC0000A48, 8)
    Field(PRTR, DWordAcc, NoLock, Preserve) {
      PRTE, 10,
      , 22,  //RESERVED
      PRTD, 10,
      , 22,  //RESERVED
    }

    // RCB PPE COM RESET
    OperationRegion(RRTR, SystemMemory, 0xC0000A88, 8)
    Field(RRTR, DWordAcc, NoLock, Preserve) {
      RRTE, 1,
      , 31,  //RESERVED
      RRTD, 1,
      , 31,  //RESERVED
    }

    // DSAF Channel RESET
    OperationRegion(DCRR, SystemMemory, 0xC0000AA8, 8)
    Field(DCRR, DWordAcc, NoLock, Preserve) {
      DCRE, 1,
      , 31,  //RESERVED
      DCRD, 1,
      , 31,  //RESERVED
    }

    // RoCE RESET
    OperationRegion(RKRR, SystemMemory, 0xC0000A50, 8)
    Field(RKRR, DWordAcc, NoLock, Preserve) {
      RKRE, 1,
      , 31,  //RESERVED
      RKRD, 1,
      , 31,  //RESERVED
    }

    // RoCE Clock enable/disable
    OperationRegion(RKCR, SystemMemory, 0xC0000328, 8)
    Field(RKCR, DWordAcc, NoLock, Preserve) {
      RCLE, 1,
      , 31,  //RESERVED
      RCLD, 1,
      , 31,  //RESERVED
    }

    // Hilink access sel cfg reg
    OperationRegion(HSER, SystemMemory, 0xC2240008, 0x4)
    Field(HSER, DWordAcc, NoLock, Preserve) {
      HSEL, 2,  // hilink_access_sel & hilink_access_wr_pul
      , 30,    // RESERVED
    }

    // Serdes
    OperationRegion(H4LR, SystemMemory, 0xC2208100, 0x1000)
    Field(H4LR, DWordAcc, NoLock, Preserve) {
      H4L0, 16,    // port0
      , 16,    //RESERVED
      Offset (0x400),
      H4L1, 16,    // port1
      , 16,    //RESERVED
      Offset (0x800),
      H4L2, 16,    // port2
      , 16,    //RESERVED
      Offset (0xc00),
      H4L3, 16,    // port3
      , 16,    //RESERVED
    }
    OperationRegion(H3LR, SystemMemory, 0xC2208900, 0x800)
    Field(H3LR, DWordAcc, NoLock, Preserve) {
      H3L2, 16,    // port4
      , 16,    //RESERVED
      Offset (0x400),
      H3L3, 16,    // port5
      , 16,    //RESERVED
    }
    OperationRegion(HSFP, SystemMemory, 0x78000010, 0x100)
    Field(HSFP, ByteAcc, NoLock, Preserve) {
      Offset (0x2),
      HSF0, 1,  // port0
      , 7,    //RESERVED
      Offset (0x6),
      HSF1, 1,    // port1
      , 7,    //RESERVED
    }
    Name (_HID, "HISI00B2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_CRS, ResourceTemplate (){
      Memory32Fixed (ReadWrite, 0xc5000000 , 0x890000)
      Memory32Fixed (ReadWrite, 0xc7000000 , 0x60000)
      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI1")
      {
        576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588,
        589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600,
      }
      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI1")
      {
        960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975,
        976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991,
        992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007,
        1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023,
        1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
        1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055,
        1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071,
        1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087,
        1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103,
        1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
        1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135,
        1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151,
      }
      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI1")
      {
        1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167,
        1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183,
        1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199,
        1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215,
        1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231,
        1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247,
        1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263,
        1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279,
        1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295,
        1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311,
        1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327,
        1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343,
      }
    })
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"mode", "6port-16rss"},
        Package () {"buf-size", 4096},
        Package () {"desc-num", 1024},
      }
    })

    Method (_PXM, 0, NotSerialized)
    {
      Return(0x00)
    }
    Method (_STA, 0, NotSerialized)
    {
      Return(0x0F)
    }

    //reset XGE port
    //Arg0 : XGE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(XRST, 2, Serialized) {
      ShiftLeft (0x2082082, Arg0, Local0)
      Or (Local0, 0x1, Local0)

      If (LEqual (Arg1, 0)) {
        Store(Local0, XRTE)
      } Else  {
        Store(Local0, XRTD)
      }
    }

    //reset XGE core
    //Arg0 : XGE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(XCRT, 2, Serialized) {
      ShiftLeft (0x2080, Arg0, Local0)

      If (LEqual (Arg1, 0)) {
        Store(Local0, XRTE)
      } Else  {
        Store(Local0, XRTD)
      }
    }

    //reset GE port
    //Arg0 : GE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(GRST, 2, Serialized) {
      If (LLessEqual (Arg0, 5)) {
        //Service port
        ShiftLeft (0x2082082, Arg0, Local0)
        ShiftLeft (0x1, Arg0, Local1)

        If (LEqual (Arg1, 0)) {
          Store(Local1, GR1E)
          Store(Local0, GR0E)
        } Else  {
          Store(Local0, GR0D)
          Store(Local1, GR1D)
        }
      }
    }

    //reset PPE port
    //Arg0 : PPE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(PRST, 2, Serialized) {
      ShiftLeft (0x1, Arg0, Local0)
      If (LEqual (Arg1, 0)) {
        Store(Local0, PRTE)
      } Else  {
        Store(Local0, PRTD)
      }
    }

    //reset DSAF channels
    //Arg0 : mask
    //Arg1 : 0 reset, 1 de-reset
    Method(DCRT, 2, Serialized) {
      If (LEqual (Arg1, 0)) {
        Store(Arg0, DCRE)
      } Else  {
        Store(Arg0, DCRD)
      }
    }

    //reset RoCE
    //Arg0 : 0 reset, 1 de-reset
    Method(RRST, 1, Serialized) {
      If (LEqual (Arg0, 0)) {
        Store(0x1, RKRE)
      } Else  {
        Store(0x1, RCLD)
        Store(0x1, RKRD)
        sleep(20)
        Store(0x1, RCLE)
      }
    }

    // Set Serdes Loopback
    //Arg0 : port
    //Arg1 : 0 disable, 1 enable
    Method(SRLP, 2, Serialized) {
      ShiftLeft (Arg1, 10, Local0)
      Switch (ToInteger(Arg0))
      {
        case (0x0){
          Store (0, HSEL)
          Store (H4L0, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L0)
        }
        case (0x1){
          Store (0, HSEL)
          Store (H4L1, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L1)
        }
        case (0x2){
          Store (0, HSEL)
          Store (H4L2, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L2)
        }
        case (0x3){
          Store (0, HSEL)
          Store (H4L3, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L3)
        }
        case (0x4){
          Store (3, HSEL)
          Store (H3L2, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H3L2)
        }
        case (0x5){
          Store (3, HSEL)
          Store (H3L3, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H3L3)
        }
      }
    }

    //Reset
    //Arg0 : reset type (1: dsaf; 2: ppe; 3:XGE core; 4:XGE; 5:ge; 6:dchan; 7:RoCE)
    //Arg1 : port
    //Arg2 : 0 disable, 1 enable
    Method(DRST, 3, Serialized)
    {
      Switch (ToInteger(Arg0))
      {
        //DSAF reset
        case (0x1)
        {
          Store (Arg2, Local0)
          If (LEqual (Local0, 0))
          {
            Store (0x1, DRTE)
            Store (0x1, NRTE)
            Sleep (10)
            Store (0x1, RRTE)
          }
          Else
          {
            Store (0x1, DRTD)
            Store (0x1, NRTD)
            Sleep (10)
            Store (0x1, RRTD)
          }
        }
        //Reset PPE port
        case (0x2)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          PRST (Local0, Local1)
        }

        //Reset XGE core
        case (0x3)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          XCRT (Local0, Local1)
        }
        //Reset XGE port
        case (0x4)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          XRST (Local0, Local1)
        }

        //Reset GE port
        case (0x5)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          GRST (Local0, Local1)
        }

        //Reset DSAF Channels
        case (0x6)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          DCRT (Local0, Local1)
        }

        //Reset RoCE
        case (0x7)
        {
          // Discarding Arg1 as it is always 0
          Store (Arg2, Local0)
          RRST (Local0)
        }
      }
    }

    // _DSM Device Specific Method
    //
    // Arg0: UUID Unique function identifier
    // Arg1: Integer Revision Level
    // Arg2: Integer Function Index
    //   0 : Return Supported Functions bit mask
    //   1 : Reset Sequence
    //    Arg3[0] : reset type (1:dsaf; 2:ppe; 3:xge core; 4:xge; 5: ge; 6:dchan; 7:RoCE)
    //    Arg3[1] : port index in dsaf
    //    Arg3[2] : 0 reset, 1 cancle reset
    //   2 : Set Serdes Loopback
    //    Arg3[0] : port
    //    Arg3[1] : 0 disable, 1 enable
    //   3 : LED op set
    //    Arg3[0] : op type
    //    Arg3[1] : port
    //    Arg3[2] : para
    //   4 : Get port type (GE or XGE)
    //    Arg3[0] : port index in dsaf
    //    Return : 0 GE, 1 XGE
    //   5 : Get sfp status
    //    Arg3[0] : port index in dsaf
    //    Return : 0 no sfp, 1 have sfp
    // Arg3: Package Parameters
    Method (_DSM, 4, Serialized)
    {
      If (LEqual(Arg0,ToUUID("1A85AA1A-E293-415E-8E28-8D690A0F820A")))
      {
        If (LEqual (Arg1, 0x00))
        {
          Switch (ToInteger(Arg2))
          {
            case (0x0)
            {
              Return (Buffer () {0x3F})
            }

            //Reset Sequence
            case (0x1)
            {
              Store (DeRefOf (Index (Arg3, 0)), Local0)
              Store (DeRefOf (Index (Arg3, 1)), Local1)
              Store (DeRefOf (Index (Arg3, 2)), Local2)
              DRST (Local0, Local1, Local2)
            }

            //Set Serdes Loopback
            case (0x2)
            {
              Store (DeRefOf (Index (Arg3, 0)), Local0)
              Store (DeRefOf (Index (Arg3, 1)), Local1)
              SRLP (Local0, Local1)
            }

            //LED op set
            case (0x3)
            {

            }

            // Get port type (GE or XGE)
            case (0x4)
            {
              Store (0, Local1)
              Store (DeRefOf (Index (Arg3, 0)), Local0)
              If (LLessEqual (Local0, 3))
              {
                // mac0: Hilink4 Lane0
                // mac1: Hilink4 Lane1
                // mac2: Hilink4 Lane2
                // mac3: Hilink4 Lane3
                Store (H4ST, Local1)
              }
              ElseIf (LLessEqual (Local0, 5))
              {
                // mac4: Hilink3 Lane2
                // mac5: Hilink3 Lane3
                Store (H3ST, Local1)
              }

              Return (Local1)
            }

            //Get sfp status
            case (0x5)
            {
              Store (1, Local1) //set no sfp default
              Store (DeRefOf (Index (Arg3, 0)), Local0)
              If (LEqual (Local0, 0))
              {
                // port 0:
                Store (HSF0, Local1)
              }
              ElseIf (LEqual (Local0, 1))
              {
                // port 1
                Store (HSF1, Local1)
              }

              XOr (Local1, 1, local1)
              Return (Local1)
            }
          }
        }
      }
      Return (Buffer() {0x00})
    }
    Device (PRT0)
    {
      Name (_ADR, 0x0)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 0},
          Package () {"media-type", "fiber"},
        }
      })
    }
    Device (PRT1)
    {
      Name (_ADR, 0x1)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 1},
          Package () {"media-type", "fiber"},
        }
      })
    }

    Device (PRT2)
    {
      Name (_ADR, 0x2)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 2},
          Package () {"media-type", "fiber"},
        }
      })
    }
    Device (PRT3)
    {
      Name (_ADR, 0x3)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 3},
          Package () {"media-type", "fiber"},
        }
      })
    }

    Device (PRT4)
    {
      Name (_ADR, 0x4)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 4},
                          Package () {"phy-mode", "sgmii"},
          Package () {"phy-addr", 0},
          Package () {"mdio-node", Package (){\_SB.MDIO}},
          Package () {"media-type", "copper"},
        }
      })
    }
    Device (PRT5)
    {
      Name (_ADR, 0x5)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 5},
          Package () {"phy-mode", "sgmii"},
          Package () {"phy-addr", 1},
          Package () {"mdio-node", Package (){\_SB.MDIO}},
          Package () {"media-type", "copper"},
        }
      })
    }
  }
  Device (ETH4) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF0}},
        Package () {"port-idx-in-ae", 4},
      }
    })
  }
  Device (ETH5) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF0}},
        Package () {"port-idx-in-ae", 5},
      }
    })
  }
  Device (ETH0) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF0}},
        Package () {"port-idx-in-ae", 0},
      }
    })
  }
  Device (ETH1) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF0}},
        Package () {"port-idx-in-ae", 1},
      }
    })
  }

  Device (ETH2) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF0}},
        Package () {"port-idx-in-ae", 2},
      }
    })
    Method (_STA, 0x0, NotSerialized)
    {
      Return (0)
    }
  }
  Device (ETH3) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF0}},
        Package () {"port-idx-in-ae", 3},
      }
    })
    Method (_STA, 0x0, NotSerialized)
    {
      Return (0)
    }
  }

  Device (ROCE) {
    Name(_HID, "HISI00D1")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"eth-handle", Package () {\_SB.ETH0, \_SB.ETH1, 0, 0, \_SB.ETH4, \_SB.ETH5}},
        Package () {"dsaf-handle", Package (){\_SB.DSF0}},
        Package () {"node-guid", Package () { 0x00, 0x9A, 0xCD, 0x00, 0x00, 0x01, 0x02, 0x03 }}, // 8-bytes
        Package () {"interrupt-names", Package() {"hns-roce-comp-0",
                                                  "hns-roce-comp-1",
                                                  "hns-roce-comp-2",
                                                  "hns-roce-comp-3",
                                                  "hns-roce-comp-4",
                                                  "hns-roce-comp-5",
                                                  "hns-roce-comp-6",
                                                  "hns-roce-comp-7",
                                                  "hns-roce-comp-8",
                                                  "hns-roce-comp-9",
                                                  "hns-roce-comp-10",
                                                  "hns-roce-comp-11",
                                                  "hns-roce-comp-12",
                                                  "hns-roce-comp-13",
                                                  "hns-roce-comp-14",
                                                  "hns-roce-comp-15",
                                                  "hns-roce-comp-16",
                                                  "hns-roce-comp-17",
                                                  "hns-roce-comp-18",
                                                  "hns-roce-comp-19",
                                                  "hns-roce-comp-20",
                                                  "hns-roce-comp-21",
                                                  "hns-roce-comp-22",
                                                  "hns-roce-comp-23",
                                                  "hns-roce-comp-24",
                                                  "hns-roce-comp-25",
                                                  "hns-roce-comp-26",
                                                  "hns-roce-comp-27",
                                                  "hns-roce-comp-28",
                                                  "hns-roce-comp-29",
                                                  "hns-roce-comp-30",
                                                  "hns-roce-comp-31",
                                                  "hns-roce-async",
                                                  "hns-roce-common"}},
      }
    })
    Name (_CRS, ResourceTemplate (){
      Memory32Fixed (ReadWrite, 0xc4000000 , 0x100000)
      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI9")
      {
        722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733,
        734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745,
        746, 747, 748, 749, 750, 751, 752, 753, 785, 754,
      }
    })
  }

  /* for p1 */
  Device (DSF1)
  {

    OperationRegion(H3SR, SystemMemory, 0x400C0000184, 4)
    Field(H3SR, DWordAcc, NoLock, Preserve) {
      H3ST, 1,
      , 31,  //RESERVED
    }
    OperationRegion(H4SR, SystemMemory, 0x400C0000194, 4)
    Field(H4SR, DWordAcc, NoLock, Preserve) {
      H4ST, 1,
      , 31,  //RESERVED
    }
    // DSAF RESET
    OperationRegion(DRER, SystemMemory, 0x400C0000A00, 8)
    Field(DRER, DWordAcc, NoLock, Preserve) {
      DRTE, 1,
      , 31,  //RESERVED
      DRTD, 1,
      , 31,  //RESERVED
    }
    // NT RESET
    OperationRegion(NRER, SystemMemory, 0x400C0000A08, 8)
    Field(NRER, DWordAcc, NoLock, Preserve) {
      NRTE, 1,
      , 31,  //RESERVED
      NRTD, 1,
      , 31,  //RESERVED
    }
    // XGE RESET
    OperationRegion(XRER, SystemMemory, 0x400C0000A10, 8)
    Field(XRER, DWordAcc, NoLock, Preserve) {
      XRTE, 31,
      , 1,    //RESERVED
      XRTD, 31,
      , 1,    //RESERVED
    }

    // GE RESET
    OperationRegion(GRTR, SystemMemory, 0x400C0000A18, 16)
    Field(GRTR, DWordAcc, NoLock, Preserve) {
      GR0E, 30,
      , 2,    //RESERVED
      GR0D, 30,
      , 2,    //RESERVED
      GR1E, 18,
      , 14,  //RESERVED
      GR1D, 18,
      , 14,  //RESERVED
    }
    // PPE RESET
    OperationRegion(PRTR, SystemMemory, 0x400C0000A48, 8)
    Field(PRTR, DWordAcc, NoLock, Preserve) {
      PRTE, 10,
      , 22,  //RESERVED
      PRTD, 10,
      , 22,  //RESERVED
    }

    // RCB PPE COM RESET
    OperationRegion(RRTR, SystemMemory, 0x400C0000A88, 8)
    Field(RRTR, DWordAcc, NoLock, Preserve) {
      RRTE, 1,
      , 31,  //RESERVED
      RRTD, 1,
      , 31,  //RESERVED
    }

    // RCB_2X COM RESET
    OperationRegion(RBTR, SystemMemory, 0x400C0000AC0, 8)
    Field(RBTR, DWordAcc, NoLock, Preserve) {
      RBTE, 1,
      , 31,  //RESERVED
      RBTD, 1,
      , 31,  //RESERVED
    }

    // Hilink access sel cfg reg
    OperationRegion(HSER, SystemMemory, 0x400C2240008, 0x4)
    Field(HSER, DWordAcc, NoLock, Preserve) {
      HSEL, 2,  // hilink_access_sel & hilink_access_wr_pul
      , 30,    // RESERVED
    }

    // Serdes
    OperationRegion(H4LR, SystemMemory, 0x400C2208100, 0x1000)
    Field(H4LR, DWordAcc, NoLock, Preserve) {
      H4L0, 16,    // port0
      , 16,    //RESERVED
      Offset (0x400),
      H4L1, 16,    // port1
      , 16,    //RESERVED
      Offset (0x800),
      H4L2, 16,    // port2
      , 16,    //RESERVED
      Offset (0xc00),
      H4L3, 16,    // port3
      , 16,    //RESERVED
    }
    OperationRegion(H3LR, SystemMemory, 0x400C2208900, 0x800)
    Field(H3LR, DWordAcc, NoLock, Preserve) {
      H3L2, 16,    // port4
      , 16,    //RESERVED
      Offset (0x400),
      H3L3, 16,    // port5
      , 16,    //RESERVED
    }

    Name (_HID, "HISI00B2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_CRS, ResourceTemplate (){
      QwordMemory (
        ResourceProducer,
        PosDecode,
        MinFixed,
        MaxFixed,
        NonCacheable,
        ReadWrite,
        0x0, // Granularity
        0x400c5000000, // Min Base Address
        0x400c588ffff, // Max Base Address
        0x0, // Translate
        0x890000 // Length
      )
      QwordMemory (
        ResourceProducer,
        PosDecode,
        MinFixed,
        MaxFixed,
        NonCacheable,
        ReadWrite,
        0x0, // Granularity
        0x400c7000000, // Min Base Address
        0x400c705ffff, // Max Base Address
        0x0, // Translate
        0x60000 // Length
      )
      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI8")
      {
        576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588,
        589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600,
      }
      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI8")
      {
        960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975,
        976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991,
        992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007,
        1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023,
        1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039,
        1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055,
        1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071,
        1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087,
        1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103,
        1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119,
        1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135,
        1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151,
      }
      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI8")
      {
        1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167,
        1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183,
        1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199,
        1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215,
        1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231,
        1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247,
        1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263,
        1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279,
        1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 1295,
        1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311,
        1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1326, 1327,
        1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343,
      }
    })
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"mode", "6port-16rss"},
        Package () {"buf-size", 4096},
        Package () {"desc-num", 1024},
      }
    })

    //reset XGE port
    //Arg0 : XGE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(XRST, 2, Serialized) {
      ShiftLeft (0x2082082, Arg0, Local0)
      Or (Local0, 0x1, Local0)

      If (LEqual (Arg1, 0)) {
        Store(Local0, XRTE)
      } Else  {
        Store(Local0, XRTD)
      }
    }

    //reset XGE core
    //Arg0 : XGE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(XCRT, 2, Serialized) {
      ShiftLeft (0x2080, Arg0, Local0)

      If (LEqual (Arg1, 0)) {
        Store(Local0, XRTE)
      } Else  {
        Store(Local0, XRTD)
      }
    }

    //reset GE port
    //Arg0 : GE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(GRST, 2, Serialized) {
      If (LLessEqual (Arg0, 5)) {
        //Service port
        ShiftLeft (0x2082082, Arg0, Local0)
        ShiftLeft (0x1, Arg0, Local1)

        If (LEqual (Arg1, 0)) {
          Store(Local1, GR1E)
          Store(Local0, GR0E)
        } Else  {
          Store(Local0, GR0D)
          Store(Local1, GR1D)
        }
      }
    }

    //reset PPE port
    //Arg0 : PPE port index in dsaf
    //Arg1 : 0 reset, 1 cancle reset
    Method(PRST, 2, Serialized) {
      ShiftLeft (0x1, Arg0, Local0)
      If (LEqual (Arg1, 0)) {
        Store(Local0, PRTE)
      } Else  {
        Store(Local0, PRTD)
      }
    }

    // Set Serdes Loopback
    //Arg0 : port
    //Arg1 : 0 disable, 1 enable
    Method(SRLP, 2, Serialized) {
      ShiftLeft (Arg1, 10, Local0)
      Switch (ToInteger(Arg0))
      {
        case (0x0){
          Store (0, HSEL)
          Store (H4L0, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L0)
        }
        case (0x1){
          Store (0, HSEL)
          Store (H4L1, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L1)
        }
        case (0x2){
          Store (0, HSEL)
          Store (H4L2, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L2)
        }
        case (0x3){
          Store (0, HSEL)
          Store (H4L3, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H4L3)
        }
        case (0x4){
          Store (3, HSEL)
          Store (H3L2, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H3L2)
        }
        case (0x5){
          Store (3, HSEL)
          Store (H3L3, Local1)
          And (Local1, 0xfffffbff, Local1)
          Or (Local0, Local1, Local0)
          Store (Local0, H3L3)
        }
      }
    }

    //Reset
    //Arg0 : reset type (1: dsaf; 2: ppe; 3:XGE core; 4:XGE; 5:G3)
    //Arg1 : port
    //Arg2 : 0 disable, 1 enable
    Method(DRST, 3, Serialized)
    {
      Switch (ToInteger(Arg0))
      {
        //DSAF reset
        case (0x1)
        {
          Store (Arg2, Local0)
          If (LEqual (Local0, 0))
          {
            Store (0x1, DRTE)
            Store (0x1, NRTE)
            Sleep (10)
            Store (0x1, RRTE)
            Store (0x1, RBTE)
          }
          Else
          {
            Store (0x1, DRTD)
            Store (0x1, NRTD)
            Sleep (10)
            Store (0x1, RRTD)
            Store (0x1, RBTD)
          }
        }
        //Reset PPE port
        case (0x2)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          PRST (Local0, Local1)
        }

        //Reset XGE core
        case (0x3)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          XCRT (Local0, Local1)
        }
        //Reset XGE port
        case (0x4)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          XRST (Local0, Local1)
        }

        //Reset GE port
        case (0x5)
        {
          Store (Arg1, Local0)
          Store (Arg2, Local1)
          GRST (Local0, Local1)
        }
      }
    }

    // _DSM Device Specific Method
    //
    // Arg0: UUID Unique function identifier
    // Arg1: Integer Revision Level
    // Arg2: Integer Function Index
    //   0 : Return Supported Functions bit mask
    //   1 : Reset Sequence
    //    Arg3[0] : reset type (1:dsaf; 2:ppe; 3:xge core; 4:xge; 5: ge)
    //    Arg3[1] : port index in dsaf
    //    Arg3[2] : 0 reset, 1 cancle reset
    //   2 : Set Serdes Loopback
    //    Arg3[0] : port
    //    Arg3[1] : 0 disable, 1 enable
    //   3 : LED op set
    //    Arg3[0] : op type
    //    Arg3[1] : port
    //    Arg3[2] : para
    //   4 : Get port type (GE or XGE)
    //    Arg3[0] : port index in dsaf
    //    Return : 0 GE, 1 XGE
    //   5 : Get sfp status
    //    Arg3[0] : port index in dsaf
    //    Return : 0 no sfp, 1 have sfp
    // Arg3: Package Parameters
    Method (_DSM, 4, Serialized)
    {
      If (LEqual(Arg0,ToUUID("1A85AA1A-E293-415E-8E28-8D690A0F820A")))
      {
        If (LEqual (Arg1, 0x00))
        {
          Switch (ToInteger(Arg2))
          {
            case (0x0)
            {
              Return (Buffer () {0x3F})
            }

            //Reset Sequence
            case (0x1)
            {
              Store (DeRefOf (Index (Arg3, 0)), Local0)
              Store (DeRefOf (Index (Arg3, 1)), Local1)
              Store (DeRefOf (Index (Arg3, 2)), Local2)
              DRST (Local0, Local1, Local2)
            }

            //Set Serdes Loopback
            case (0x2)
            {
              Store (DeRefOf (Index (Arg3, 0)), Local0)
              Store (DeRefOf (Index (Arg3, 1)), Local1)
              SRLP (Local0, Local1)
            }

            //LED op set
            case (0x3)
            {

            }

            // Get port type (GE or XGE)
            case (0x4)
            {
              Store (0, Local1)
              Store (DeRefOf (Index (Arg3, 0)), Local0)
              If (LLessEqual (Local0, 3))
              {
                // mac0: Hilink4 Lane0
                // mac1: Hilink4 Lane1
                // mac2: Hilink4 Lane2
                // mac3: Hilink4 Lane3
                Store (H4ST, Local1)
              }
              ElseIf (LLessEqual (Local0, 5))
              {
                // mac4: Hilink3 Lane2
                // mac5: Hilink3 Lane3
                Store (H3ST, Local1)
              }

              Return (Local1)
            }

            //Get sfp status
            case (0x5)
            {

            }
          }
        }
      }
      Return (Buffer() {0x00})
    }

    Device (PRT6)
    {
      Name (_ADR, 0x6)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 0},
          Package () {"media-type", "fiber"},
        }
      })
    }
    Device (PRT7)
    {
      Name (_ADR, 0x7)
      Name (_DSD, Package () {
        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
        Package () {
          Package () {"reg", 1},
          Package () {"media-type", "fiber"},
        }
      })
    }
  }

  Device (ETH6) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF1}},
        Package () {"port-idx-in-ae", 0},
      }
    })
    Method (_STA, 0x0, NotSerialized)
    {
      Return (0)
    }
  }
  Device (ETH7) {
    Name(_HID, "HISI00C2")
    Name (_CCA, 1) // Cache-coherent controller
    Name (_DSD, Package () {
      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
      Package () {
        Package () {"local-mac-address", Package () { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, // 6-bytes
        Package () {"ae-handle", Package (){\_SB.DSF1}},
        Package () {"port-idx-in-ae", 1},
      }
    })
    Method (_STA, 0x0, NotSerialized)
    {
      Return (0)
    }
  }

}
